#include <assert.h>
#include <ctype.h>
#include <locale.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


double average(int num, ...)
{
    printf("***** average *****\n");
    va_list valist;
    double sum = 0.0;
    int i;

    /* 为 num 个参数初始化 valist */
    va_start(valist, num);

    /* 访问所有赋给 valist 的参数 */
    for ( i = 0; i < num; i++)
    {
        sum += va_arg(valist, int);
    }
    /* 清理为 valist 保留的内存 */
    va_end(valist);

    return sum/num;

}
void simple_printf(const char* fmt, ...)
{
    printf("***** simple_printf *****\n");
    va_list args;
    va_start(args, fmt);
 
    while (*fmt != '\0') {
        if (*fmt == 'd') {
            int i = va_arg(args, int);
            printf("%d\n", i);
        } else if (*fmt == 'c') {
            // A 'char' variable will be promoted to 'int'
            // A character literal in C is already 'int' by itself
            int c = va_arg(args, int);
            printf("%c\n", c);
        } else if (*fmt == 'f') {
            double d = va_arg(args, double);
            printf("%f\n", d);
        }
        ++fmt;
    }
 
    va_end(args);
}

void main(void)
{
    printf("Average of 2,3,4,5 = %f\n", average(4, 2,3,4,5));
    simple_printf("dcff", 3, 'a', 1.999, 42.5);
    system("pause");
}


/*
根据具体的需求接受可变数量的参数

    int func(int, ... ) 
    {
    .
    .
    .
    }
    
    int main()
    {
    func(2, 2, 3);
    func(3, 2, 3, 4);
    }

stdarg.h 头文件，该文件提供了实现可变参数功能的函数和宏
    定义一个函数，最后一个参数为省略号，省略号前面可以设置自定义参数
    在函数定义中创建一个 va_list 类型变量，该类型是在 stdarg.h 头文件中定义的。
    使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
    使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
    使用宏 va_end 来清理赋予 va_list 变量的内存


*/